package middleware

import (
	"PublicBenefitActivities/utils"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// 一个用于从 panic 中恢复的中间件。
// 该中间件用于捕获在 Gin 框架后续中间件或处理函数执行过程中发生的 panic，
// 并通过传入的日志记录器记录错误信息，然后向客户端返回服务器繁忙的错误。
// 参数:
//
//	logger - 指向 zap.Logger 的指针，用于记录错误信息。
//
// 返回值:
//
//	gin.HandlerFunc - Gin 框架使用的中间件函数。
func Recovery(logger *zap.Logger) gin.HandlerFunc {
	return func(c *gin.Context) {
		// 使用 defer 来捕获后续代码执行中可能发生的 panic 错误
		defer func() {
			// 如果捕获到 panic 错误
			if err := recover(); err != nil {
				// 使用提供的日志记录器记录错误信息
				logger.Error("panic recover error", zap.Any("error", err))
				// 向客户端返回服务器繁忙的错误响应
				utils.ResponseError(c, utils.CodeServerBusy)
			}
		}()
		// 调用中间件链中的下一个中间件或处理函数
		c.Next()
	}
}
